package com.inspinia.upms.rpc.api;


import com.inspinia.base.service.BaseService;
import com.inspinia.upms.common.model.org.UpmsOrgDeptVo;
import com.inspinia.upms.common.model.org.UpmsOrgDeptVoType;
import com.inspinia.upms.common.model.org.UpmsOrganization;

import java.util.List;

/**
 * Created by veblen on 16-2-1.
 */
public interface UpmsOrganizationService extends BaseService<UpmsOrganization> {
    List<UpmsOrganization> findAll();

    boolean validateName(String resourceName, Long resourceId, Long pid);


    List<Long> findChildrenIds(Long id);

    /**
     * 查找部门的所有子部门
     *
     * @param id  部门id
     * @param ids 部门id集合,用以装返回结果
     */
    void findChildrenById(Long id, List<Long> ids);

    /**
     * 查找部门和组织组合的树形数据
     *
     * @param treeType
     * @return
     */
    List<UpmsOrgDeptVo> findOrgAndDept4tree(UpmsOrgDeptVoType treeType);

    /**
     * 根据id获取机构的名称
     *
     * @param orgId 机构id
     * @return
     */
    String getNameById(Long orgId);

    /**
     * 根据城市id查找该城市的机构
     *
     * @param cityId 城市id
     * @return
     */
    List<Long> findOrgIdByCityId(Long cityId);

    /**
     * 根据区县id查找该区县的机构
     *
     * @param countyId 城市id
     * @return
     */
    List<Long> findOrgIdByCountyId(Long countyId);

    /**
     * 查找组织机构所在的城市id
     *
     * @param orgIds 机构id
     * @return 城市id集合
     */
    List<Long> findCityIds(List<Long> orgIds);

    /**
     * 根据名称进行查找
     *
     * @param orgName 机构名称
     * @return
     */
    List<Long> findOrgIdsByNames(List<String> orgName);

    /**
     * 查找所有的组织机构，并根据组织机构排除某些id
     *
     * @param excludeIds 排除
     * @return 组织机构集合
     */
    List<UpmsOrganization> findAllWithExcludeIds(Long... excludeIds);

    /**
     * 根据部门id集合查找机构的id
     *
     * @param deptIds 部门id集合
     * @return 机构id集合
     */
    List<Long> findOrgIdByDeptIds(List<Long> deptIds);

    /**
     * 根据用户id获取组织机构
     *
     * @param userId
     * @return
     */
    UpmsOrganization findOrgByUserId(Long userId);

    /**
     * 插入组织机构
     *
     * @param bean
     * @return
     */
    boolean insertByBean(UpmsOrganization bean);

    /**
     * 修改组织机构
     *
     * @param bean
     * @return
     */
    boolean updateByBean(UpmsOrganization bean);

    List<UpmsOrganization> findOrganizationByArea(Long provinceId, Long cityId, Long countyId);

    /**
     * 查询父级下所有子集
     *
     * @param parentId
     * @return
     */
    List<UpmsOrganization> findByParentId(Long parentId);

    /**
     * 查找用户所在机构的父级机构
     *
     * @param userId 用户id
     * @return 父级机构，注意：父级机构可能为空
     */
    UpmsOrganization getParentOrg(Long userId);

    /**
     * 查找用户所在机构的平级机构
     *
     * @param userId 用户id
     * @return
     */
    List<UpmsOrganization> findSameLevelOrgs(Long userId);

    /**
     * 查找用户所在市下面的机构的平级机构
     * @param userId
     * @return
     */
    List<UpmsOrganization> findSameLevelOrgAndCity(Long userId);
}
